const moment = require('moment');

/**
 * 判断是否是对象
 * @param {Object} obj 
 * @returns 
 */
function isObject(obj) {
  return obj !== null && typeof obj === 'object' && !Array.isArray(obj);
}

/**
 * 不足n位，补齐n位
 * @param {Number} value 
 * @param {Number} n
 * @returns 
 */
function padToTwoDigits(value, n = 2) {
  return value.toString().padStart(n, '0');
}

/**
 * 获取一个两位随机数
 */
function getTwoDigits() {
  const randomNum = Math.floor(Math.random() * 100); // 生成0-99之间的随机数
  return padToTwoDigits(randomNum, 2); // 补齐两位
}

/**
 * 获取当前时间戳
 * @returns 
 */
function getTimestamp() {
  return Date.now();
}

/**
 * 格式化时间
 * @param {*} date 
 * @returns 
 */
function formatTime(date, format = 'YYYY-MM-DD HH:mm:ss') {
  if (!date) return null;
  return moment(date).format(format);
}

/**
 * 格式化字段（把所有_删除，并且_后面的第一个字母从小写变大写）
 * @param {String} str
 * @returns 
 */
function formatField(str) {
  if (!str) return null;
  return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
}

/**
 * 反向格式化字段（把所有大写字母前面加_，并且大写变小写）
 * @param {String} str
 * @returns 
 */
function reverseFormatField(str) {
  if (!str) return null;
  return str.replace(/([A-Z])/g, (_, letter) => `_${letter.toLowerCase()}`);
}

/**
 * 格式化对象的key (遍历对象，把所有key格式化，如果key中存在"time"则格式化为时间)
 * @param {Object} obj
 * @returns {Object}
 */
function formatObject(obj) {
  if (!isObject(obj)) return obj;
  const formattedObj = {};
  for (const key in obj) {
    const formattedKey = formatField(key);
    if (formattedKey.includes('time') || formattedKey.includes('Time')) {
      formattedObj[formattedKey] = formatTime(obj[key]);
    } else {
      formattedObj[formattedKey] = obj[key];
    }
  }
  return formattedObj;
}

/**
 * 反向格式化对象的key (遍历对象，把所有key反向格式化)
 * @param {Object} obj
 * @returns {Object}
 */
function reverseFormatObject(obj) {
  if (!isObject(obj)) return obj;
  const formattedObj = {};
  for (const key in obj) {
    if (obj[key] === null || obj[key] === undefined || obj[key] === "") continue; // 跳过null和undefined的值
    const formattedKey = reverseFormatField(key);
    formattedObj[formattedKey] = obj[key];
  }
  return formattedObj;
}

module.exports = {
  isObject,
  padToTwoDigits,
  getTimestamp,
  getTwoDigits,
  formatTime,
  formatField,
  reverseFormatField,
  formatObject,
  reverseFormatObject,
}